/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function(nums, k) {
    if(nums.length == 0 || k == 0) return null
    const queue = [],len = nums.length,ans = []
    for(let i = 0; i < len; i++){
        if(queue.length == 0) queue.push(i)
        else{
            //保证队首元素的下标和将要push的元素的下标满足indexIn - indexOut<= k-1
            //如果不满足，就直接弹出队首元素
            while(i - queue[0] > k - 1) queue.shift()
            //保证队列的单调性，如果push的元素大于队尾的元素，那么就将队尾的元素弹出，直到push的元素小于等于队尾的元素
            while(nums[i] >= nums[queue[queue.length - 1]]) queue.pop()
            queue.push(i)
        }
        //当i >= k - 1时，每滑动一次，就将队首元素放入最后的结果数组中
        if(i >= k - 1) ans.push(nums[queue[0]])
    }
    return ans
};